/**
 * 最终版
 * 懒汉模式
 * 双重检查锁 (DCL)
 */
public class SingletonLazy3 {

    // 先不初始化, 用到的时候在创建
    // 定义为 volatile 防止了指令的重排序
    private volatile static SingletonLazy3 singletonLazy3 = null;

    private SingletonLazy3() {

    }

    // 提供一个获取对象的方法
    public static SingletonLazy3 getInstance() {

        // 在外面再判断一次, 这样后续的就直接走外面的跳过了, 直接返回了
        if (singletonLazy3 == null) {
            synchronized (SingletonLazy3.class) {
                // 对象为 null 的话创建一个
                if (singletonLazy3 == null) {
                    singletonLazy3 = new SingletonLazy3();
                }
            }
        }

        return singletonLazy3;
    }
}
